public class IntegerIterator implements Iterator<Integer>, Iterable<Integer> { private Integer nextValue = 0; public boolean hasNext() { return nextValue < 100000; } public Integer next() { return nextValue++; } public Integer getNextValue() { return nextValue; } }
IntegerIterator iterator = new IntegerIterator(); for (Integer value : iterator) { } assertEquals(10000, iterator.getNextValue()
public class UseIntegerIterator implements Runnable { IntegerIterator iterator; public UseIntegerIterator(IntegerIterator iterator) { this.iterator = iterator; } @Override public void run() { while (iterator.hasNext()) { iterator.next(); } } }
IntegerIterator iterator = new IntegerIterator(); Thread t1 = new Thread(new UseIntegerIterator(iterator)); Thread t2 = new Thread(new UseIntegerIterator(iterator)); t1.start(); t2.start(); t1.join(); t2.join(); assertEqual(10000, iterator.getNextValue()); // ??
public class UseIntegerIteratorClientBasedLocking implements Runnable { public void run() { while (true) { synchronized (iterator) { if (iterator.hasNext()) iterator.next(); else break; } } } }
package dependent.serverbasedlocking; public class IntegerIteratorServerLocked { private Integer nextValue = 0; public synchronized Integer getNextOrNull() { if (nextValue < 100000) return nextValue++; else return null; } public Integer getNextValue() { return nextValue; } }
public void run() { while (true) { Integer next = iterator.getNextOrNull(); if (next == null) break; } }
You need to enable Javascript in your browser to edit pages.
help on how to format text
Keep It Away From Me
Scope it way down...
A guideline to live by…Manage concurrent-based stuff managed in one place
Close to where that stuff lives
Dependent State
Consider the following (incomplete) iterator:Dependent State+Multi-Threaded
Use this code in a test:What about this use:
public class UseIntegerIterator implements Runnable { IntegerIterator iterator; public UseIntegerIterator(IntegerIterator iterator) { this.iterator = iterator; } @Override public void run() { while (iterator.hasNext()) { iterator.next(); } } }And then in some test somewhere:There's a problem. How can we fix it?
Client Based Locking
The client (user) of the common data locks:Server-Based Locking
The server guards the dependent calls:Here’s an updated client that now works:
Evaluate, between client-based and server-based locking
==Client or Server-based?
When you have control of the code: Prefer server-based locking
What if you don't have control?
<--Back | ^Top^ | Next-->